import BLE from '~/pages/blueTest/commonBLE.js'
//import { resolveDeviceStatusInfo, resolveRFIDInfo, resovleLasttBeaconInfo } from '@/utils/bleDecode/xcBluetoothResolve'
import {
	BLE_IDX_CONFIG,
	BLE_CMD_CONFIG
} from '~/pages/blueTest/bleConfig.js'





function resolveResult(result) {
	const cmd = parseInt(result.substring(0, 2), 16);
	const length = parseInt(result.substring(2, 4), 16);
	const retCode = parseInt(result.substring(4, 4 + length * 2), 16)
	const crc = parseInt(result.substring(4 + length * 2, 6 + length * 2), 16);
	if (crc == cmd + length + retCode) {
		return {
			cmd: cmd,
			code: retCode,
			data: result
		};
	} else { //处理不了，交给下一级处理
		return {
			cmd: cmd,
			code: 0,
			data: result
		};
	}
}

const bleInitSearch = async (imei, send, resolve) => {
	const initBLE = await BLE.init() 
	if (!initBLE) {
		resolve({
			success: false
		})
	}

	const initSearch = async (imei, send) => {
		BLE.onSearch(imei, send, 20000)
		// 进行蓝牙搜索
		const bleSearch = await BLE.search()
		if (bleSearch) { // 执行搜索成功，交给onSearch监听
			uni.$emit('blueLog', '执行蓝牙搜索 --> 成功')
		} else { // 执行搜索失败，执行返回
			uni.$emit('blueLog', '执行蓝牙搜索 --> 失败')
			resolve({
				success: false
			})
		}
	}
	// 查找设备
	// TODO 此处蓝牙中断情况需验证
	const deviceListByHistory = BLE.deviceListByHistory.filter(item => {
		return item.imei === imei
	})
	if (deviceListByHistory.length) { // 设备连接过，直接用
		const connectionHistoryDevice = await BLE.connectionHistoryDevice(deviceListByHistory[0], 20000)
		if (connectionHistoryDevice) {
			uni.$emit('blueLog', '连接蓝牙历史 --> 成功', deviceListByHistory[0].device)
			send(deviceListByHistory[0].device)
		} else { // 连接蓝牙历史失败了，尝试用蓝牙查找设备
			uni.$emit('blueLog', '连接蓝牙历史 --> 失败')
			initSearch(imei, send)
		}
	} else { // 设备从未连接，需用蓝牙查找设备
		uni.$emit('blueLog', '蓝牙查找设备')
		initSearch(imei, send)
	}
}
let btk = ''
const bleCommand = {

	setBtk(data) {
		btk = data
	},
	getDeviceInfo(imei) {
		return new Promise(resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.GET_DEVICE_INFO, '', (res) => { // 867567044900843
						// TODO 需要解析蓝牙结果，再根据结果进行判断
						// res.valueDecode = resolveDeviceStatusInfo(res.valueFormat)
						uni.$emit('blueLog', '发送蓝牙获取车辆信息指令的回调 --> 成功', res)
						resolve({
							success: true,
							data: res
						})
					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙获取车辆信息指令的回调 --> 失败', err)
						resolve({
							success: false,
							data: {
								valueDecode: {}
							}
						})
					})
				} else {
					uni.$emit('blueLog', '发送蓝牙获取车辆信息指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false,
						data: {
							valueDecode: {}
						}
					})
				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	playVoice: async (imei, idx) => { // 播放语音 [2, 100] 语音位,音量
		return new Promise(resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.PLAY_VOICE, idx || [0, 0], (
					res) => { // 867567044900843
						uni.$emit('blueLog', '发送蓝牙播放语音指令的回调 --> 成功', res)
						if (res && res.valueFormat) {
							const {
								code
							} = resolveResult(res.valueFormat)
							uni.$emit('blueLog', '发送蓝牙播放语音指令的回调结果解析 --> ', code)
							if (code === 0) { // 操作成功
								resolve({
									success: true
								})

							} else {
								resolve({
									success: false
								})

							}
						} else {
							resolve({
								success: false
							})

						}
					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙播放语音指令的回调 --> 失败', err)
						resolve({
							success: false
						})

					})
				} else {
					resolve({
						success: false
					})

				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	openBike: async (imei, isMute) => { // 蓝牙开车 isMute为true则表示不播放语音
		return new Promise(async resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				uni.$emit('blueLog', '开发发送命令 --> ', device)
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.START,   [], 
					(res) => {  
						uni.$emit('blueLog', '发送蓝牙开车指令的回调 --> 成功', res)
						if (res && res.valueFormat) {
							
							// const {
							// 	code
							// } = resolveResult(res.valueFormat)
							//uni.$emit('blueLog', '发送蓝牙开车指令的回调结果解析 --> ', code)
							resolve({
								success: true
							})
							// if (code === 0) { // 操作成功
							// 	resolve({
							// 		success: true
							// 	})

							// } else {
							// 	resolve({
							// 		success: false
							// 	})

							// }
						} else {
							resolve({
								success: false
							})

						}
					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙开车指令的回调 --> 失败', err)
						resolve({
							success: false
						})

					})
				} else {
					uni.$emit('blueLog', '发送蓝牙开车指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false
					})

				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	returnBike: async (imei, isMute) => { // 蓝牙锁车isMute为true则表示不播放语音
		return new Promise(async resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				uni.$emit('blueLog', '发送蓝牙锁车指令 --> ', device)
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.LOCK,   '', (
					res) => { // 默认语音位为空
						uni.$emit('blueLog', '发送蓝牙锁车指令的回调 --> 成功', res)
						if (res && res.valueFormat) {
							// const {
							// 	code
							// } = resolveResult(res.valueFormat)
							// uni.$emit('blueLog', '发送蓝牙锁车指令的回调结果解析 --> ', code)
							// if (code === 0) { // 操作成功
								resolve({
									success: true
								})

							// } else {
							// 	resolve({
							// 		success: false
							// 	})

							// }
						} else {
							resolve({
								success: false
							})

						}
					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙锁车指令的回调 --> 失败', err)
						resolve({
							success: false
						})

					})
				} else {
					uni.$emit('blueLog', '发送蓝牙锁车指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false
					})

				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	tempReturnBike: async (imei) => { // 蓝牙临时锁车
		return new Promise(async resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				uni.$emit('blueLog', '发送蓝牙临时锁车指令 --> ', device)
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.LOCK, [BLE_IDX_CONFIG.TEMP_LOCK, 100], (
						res) => {
							uni.$emit('blueLog', '发送蓝牙锁车指令的回调 --> 成功', res)
							if (res && res.valueFormat) {
								const {
									code
								} = resolveResult(res.valueFormat)
								uni.$emit('blueLog', '发送蓝牙锁车指令的回调结果解析 --> ', code)
								if (code === 0) { // 操作成功
									resolve({
										success: true
									})

								} else {
									resolve({
										success: false
									})

								}
							} else {
								resolve({
									success: false
								})

							}
						}, (err) => {
							uni.$emit('blueLog', '发送蓝牙临时锁车指令的回调 --> 失败', err)
							resolve({
								success: false
							})

						})
				} else {
					uni.$emit('blueLog', '发送蓝牙临时锁车指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false
					})

				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	checkBeacon: async (imei) => { // 蓝牙检测道钉信息
		return new Promise(async resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				uni.$emit('blueLog', '发送蓝牙检测道钉信息指令 --> ', device)
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.GET_LAST_BEACON_INFO, '', (res) => {
						uni.$emit('blueLog', '发送蓝牙检测道钉信息指令的回调 --> 成功', res)
						//res.valueDecode = resovleLasttBeaconInfo(res.valueFormat)
						resolve({
							success: true,
							data: res
						})

					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙检测道钉信息指令的回调 --> 失败', err)
						resolve({
							success: false,
							data: {
								valueDecode: {}
							}
						})

					})
				} else {
					uni.$emit('blueLog', '发送蓝牙检测道钉信息指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false,
						data: {
							valueDecode: {}
						}
					})

				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	},
	checkRFID: async (imei) => { // 蓝牙检测RFID信息 --> 目前暂未得到蓝牙设备响应
		return new Promise(async resolve => {
			const send = (device) => { // 查询到设备后执行发送指令
				uni.$emit('blueLog', '发送蓝牙检测RFID信息指令 --> ', device)
				if (device) {
					BLE.send(imei, BLE_CMD_CONFIG.GET_RFID, '', (res) => {
						uni.$emit('blueLog', '发送蓝牙检测RFID信息指令的回调 --> 成功', res)
						//res.valueDecode = resolveRFIDInfo(res.valueFormat)
						resolve({
							success: true,
							data: res
						})
					}, (err) => {
						uni.$emit('blueLog', '发送蓝牙检测RFID信息指令的回调 --> 失败', err)
						resolve({
							success: false,
							data: {
								valueDecode: {}
							}
						})
					})
				} else {
					uni.$emit('blueLog', '发送蓝牙检测RFID信息指令的回调 --> 失败', '未找到设备')
					resolve({
						success: false,
						data: {
							valueDecode: {}
						}
					})
				}
			}
			// 检查蓝牙状态
			bleInitSearch(imei, send, resolve)
		})
	}
}

export default bleCommand